<?php


namespace BP\CompteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use BP\CompteBundle\Form\OperationForm;
use BP\CompteBundle\Form\OperationType;
use BP\CompteBundle\Entity\Compte;
use BP\CompteBundle\Entity\Operation;
use BP\UtilisateurBundle\Entity\Utilisateur;

use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

class CompteManagerController extends Controller
{

	public function createCompteAction()
	{
		//verification du user
		//===========================================================================
		$user = $this->container->get('security.context')->getToken()->getUser();
		if ( !is_object($user) ) {
            return $this->redirect($this->generateUrl('fos_user_security_login'));
        }
        
        //creation du formulaire de creation de compte
        //===========================================================================
        $compte = new Compte();
        $compte->setUserId($user->getId());
        $form = $this->createFormBuilder($compte)
        	->add('name')
        	->add('value')
        	->add('solde')
        	->add('description')
        	->getForm();
        
        $em = $this->container->get('doctrine')->getEntityManager();
        
   		// On récupère la requête.
    	$request = $this->get('request');
		
    	
    	// On vérifie qu'elle est de type « POST ».
    	//==========================================
    	if( $request->getMethod() == 'POST' )
    	{
	    	// On fait le lien Requête <-> Formulaire.
	    	$form->bindRequest($request);
	    	
	    	// On vérifie que les valeurs entrées sont correctes.
	    	if( $form->isValid() )
	    	{
		    	// On récupère notre objet.
		    	$compte = $form->getData();
				$compteId = $compte->getId();
		    	
		    	// On l'enregistre dans la base de données.
		    	$em = $this->getDoctrine()->getEntityManager();
		    	$em->persist($compte);
		    	$em->flush();
		    	
		    	// On redirige vers la page /voscomptes.
				// TODO ne marche pas car on ne specifie pas quil faut une variable dans lurl
				// il faut recuperer les id en POST dans la methode associe displayCompte
		    	return $this->redirect($this->generateUrl('BPCompteBundle_CompteManager_displayCompte',array('compteId' => $compteId)));
	    	}
    	}
    	//affichage de la vue
    	//==========================================================================
    	$vue = array('form' => $form->createView());
    	return $this->container->get('templating')->renderResponse('BPCompteBundle:CompteManager:compteCreate.html.twig',$vue);

	}

	/*
	*	Supprime un compte
	*
	*	Il est pour le moment necessaire de donner l'id du compte a supprimer
	*	en argument. Ca serait cool de passer lid avec un methode POST a la place
	*	de manière à avoir cette url: /compte/delete
	*
	*	TODO L'action est vulnérable à une attaque XSRF
	*	La correction passe par la creation d'un token unique et daté
	*	On peut donc y palier en utilisant un formulaire SF2
	* 	voir comment fait le CRUD pour y arriver proprement
	*/
	public function deleteCompteAction($compteId)
	{
		$em = $this->container->get('doctrine')->getEntityManager();
		$compte = $em->getRepository('BPCompteBundle:Compte')->find($compteId);

		$user = $this->container->get('security.context')->getToken()->getUser();
		if (!is_object($user) || $user->getId() != $compte->getUserId() ) {
            return $this->redirect($this->generateUrl('fos_user_security_login'));
        }
		
		$compte->setDeleted($compteId);
		$em->persist($compte);
		$em->flush();
		
		return $this->redirect($this->generateUrl('BPCompteBundle_CompteManager_displayCompte'));
	}

	/*
	*	Cette methode permet le chargemenbt des comptes liés a un utilisateur
	*   Elle est utilise pour laffichage des compte de la barre de navigation
	*	voir view/Default/main.html.twig
	*/
	public function getComptesAction()
	{
		$user = $this->container->get('security.context')->getToken()->getUser();	
		$em = $this->container->get('doctrine')->getEntityManager();
		$comptes = $em->getRepository('BPCompteBundle:Compte')->findBy(array('user_id' => $user->getId(), 'deleted'=>0));

			
		return $this->container->get('templating')->renderResponse('BPCompteBundle:Default:navigation.html.twig', array( 'comptes' => $comptes));
	}

	/*
	*	Author: Macquart Thomas
	*
	*	retourne le compte correspondant à lid donne en POST
	*/
	public function getCompteByAjaxAction($createOperation = 0)
	{
	
		$request = $this->container->get('request');
		
		
		if($request->isXmlHttpRequest())
		{
			$compteId = $request->request->get('compteId');
			
			$em = $this->container->get('doctrine')->getEntityManager();
			
			$compte = $em->getRepository('BPCompteBundle:Compte')->find($compteId);

			//chargement des operations du compte
			//===============================================================
			$repository = $em->getRepository('BPCompteBundle:Operation');

			$query = $repository->createQueryBuilder('c')
					->where('c.compte_id = :compte_id AND c.deleted = 0')
					->setParameter('compte_id', $compteId)
					->orderBy('c.updated_at','DESC')
					->getQuery();

			$query->setMaxresults(15);			
			$operations = $query->getResult();
			
			return $this->container->get('templating')->renderResponse('BPCompteBundle:CompteManager:getCompteByAjax.html.twig', array(
				'compte' => $compte, 'operations' => $operations, 'createOperation' => $createOperation
			));
		}
	}

	/*
	*	@author: Macquart Thomas
	*
	*	Controller de construction de la page /vosComptes
	*   Si un id de compte est present en argument, le controller retourne 
	*   l'objet Compte correspondant
	*
	*	Sinon, retourne le 
	*	compte principal de lutilisateur (cas où lutilisateur se connecte)
	*
	*	TODO: lid du compte doit etre passé en POST pour que les formualire puisse
	*	atteindre laction sans passer lid dans lurl
	*/
	public function displayCompteAction( $compteId = -1 )
	{
		$user = $this->container->get('security.context')->getToken()->getUser();

		if ( !is_object($user) ) {
            return $this->redirect($this->generateUrl('fos_user_security_login'));
        }

		$userId = $user->getId();
		
		$em = $this->container->get('doctrine')->getEntityManager();
		
		//construction du formulaire doperation
		//==================================================================

		// si compte = NULL alors on ouvre le compte principal
		if ( $compteId == -1 ) {
			
			$compte = $em->getRepository('BPCompteBundle:Compte')->findMainCompte($user);
			$compteId = $compte->getId();

			//chargement des operations du compte
			//===============================================================
			$repository = $em->getRepository('BPCompteBundle:Operation');

			$query = $repository->createQueryBuilder('c')
					->where('c.compte_id = :compte_id AND c.deleted = 0')
					->setParameter('compte_id', $compteId)
					->orderBy('c.updated_at','DESC')
					->getQuery();

			$query->setMaxresults(15);
			
			$operations = $query->getResult();
	
		
			$vue = array('compte' => $compte, 'operations' => $operations);
		
			return $this->container->get('templating')->renderResponse('BPCompteBundle:CompteManager:displayCompte.html.twig',$vue);
		
		} else { //si il y a un compte en argument

			$compte = $em->getRepository('BPCompteBundle:Compte')
							->find($compteId);			
		

			//chargement du compte selectionnee
			//=============================================================
			$compteId = $compte->getId();
		
			//chargement des operations du compte
			//================================================================
			$repository = $em->getRepository('BPCompteBundle:Operation');

			$query = $repository->createQueryBuilder('c')
					->where('c.compte_id = :compte_id AND c.deleted = 0')
					->setParameter('compte_id', $compteId)
					->orderBy('c.updated_at','DESC')
					->getQuery();
			
			$query->setMaxresults(15);
			$operations = $query->getResult();
		
		
			$vue = array('compte' => $compte, 'operations' => $operations);
			
			return $this->container->get('templating')->renderResponse('BPCompteBundle:CompteManager:displayCompte.html.twig',$vue);
		}
	}
}
